package org.smallframework.spring.util;

import org.springframework.cglib.beans.BeanCopier;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * spring cglib copy方法
 */
public class BeanCopierUtils {

    public static Map<String, BeanCopier> beanCopierMap = new ConcurrentHashMap<>();

    /**
     * 使用Copier进行拷贝，增加拷贝效率;注意此方法拷贝会将所有属性遍历一遍(包含null的属性也会拷贝一次)
     * 默认BeanCopier只会做同名，同类型属性的copier,否则就会报错.
     * 注意对于集合类型最好单独处理.
     * @param source
     * @param target
     * @param <T>
     * @param <I>
     */
    public static <T, I> void copyProperties(T source, I target) {
        String beanKey = generateKey(source.getClass(), target.getClass());
        BeanCopier copier = beanCopierMap.get(beanKey);
        if (copier == null) {
            copier = BeanCopier.create(source.getClass(), target.getClass(), false);
            beanCopierMap.put(beanKey, copier);
        }
        copier.copy(source, target, null);
    }

    private static String generateKey(Class<?> aClass, Class<?> aClass1) {
        return aClass.toString() + aClass1.toString();
    }


}
